#ifndef	__UDS_SERVICE_H_
#define	__UDS_SERVICE_H_



#include <stdint.h>
#include "uds_type.h"


typedef enum __UDS_NRC_ENUM__
{
	NRC_GENERAL_REJECT=0x10,
	NRC_SERVICE_NOT_SUPPORTED=0x11,
	NRC_SUBFUNCTION_NOT_SUPPORTED = 0x12,
	NRC_INVALID_MESSAGE_LENGTH_OR_FORMAT=0x13,
	NRC_CONDITIONS_NOT_CORRECT=0x22,
	NRC_REQUEST_SEQUENCE_ERROR=0x24,
	NRC_REQUEST_OUT_OF_RANGE=0x31,
    NRC_SECURITY_ACCESS_DENIED=0x33,
    NRC_INVALID_KEY=0x35,
    NRC_EXCEEDED_NUMBER_OF_ATTEMPTS=0x36,
    NRC_REQUIRED_TIME_DELAY_NOT_EXPIRED=0x37,
    NRC_GENERAL_PROGRAMMING_FAILURE=0x72,
    NRC_SERVICE_BUSY=0x78,
	NRC_SERVICE_NOT_SUPPORTED_IN_ACTIVE_SESSION=0x7F,
}uds_nrc_em;



#define UDS_GET_SUB_FUNCTION_SUPPRESS_POSRSP(byte)    ((byte >> 7u)&0x01u)
#define UDS_GET_SUB_FUNCTION(byte)     (byte & 0x7fu)


#define POSITIVE_RSP 			0x40
#define NEGATIVE_RSP 			0x7F
#define USD_GET_POSITIVE_RSP(server_id)         (POSITIVE_RSP + server_id)



#define TIMEOUT_FSA          (10000) /* 10s */
#define TIMEOUT_S3server     (5000)  /* 5000ms */


typedef enum __UDS_TIMER_T__
{
	UDS_TIMER_FSA = 0,
	UDS_TIMER_S3server,			// S3server 定时器，在非默认会话模式下，如果在 TIMEOUT_S3server 时间内没有收到任何消息的话，将自动回到默认会话
	UDS_TIMER_CNT
}uds_timer_t;
#define P2_SERVER               (50)    /* 50ms */
#define P2X_SERVER              (0x190)  /* 4000ms / 10 */


/* uds diagnostic session */
typedef enum __UDS_SESSION_T_
{
	UDS_SESSION_NONE = 0,
	UDS_SESSION_STD,			// 默认会话
	UDS_SESSION_PROG,			// 编程会话
	UDS_SESSION_EXT				// 扩展会话
}uds_session_t;

/* uds security access level */
typedef enum __UDS_SA_LV__
{
	UDS_SA_NON = 0,				// 安全访问等级 - 无
	UDS_SA_LV1,					// 安全访问等级 - 1 级
	UDS_SA_LV2,					// 安全访问等级 - 2 级
}uds_sa_lv;


/* uds Communication control mode */
typedef enum __UDS_CC_MODE__
{
	UDS_CC_MODE_RX_TX = 0,
	UDS_CC_MODE_RX_NO,
	UDS_CC_MODE_NO_TX,
	UDS_CC_MODE_NO_NO
}uds_cc_mode;



typedef struct __UDS_SERVICE_T__
{
    uint8_t uds_sid;
	void (* uds_service)  (const uint8_t *, uint16_t);
	bool_t (* check_len)  (const uint8_t *, uint16_t);
    bool_t std_spt;   /* default session support */
	bool_t prog_spt;  /* program session support */
    bool_t ext_spt;   /* extended session support */
    bool_t fun_spt;   /* function address support */
	bool_t ssp_spt;   /* subfunction suppress PosRsp bit support */
    uds_sa_lv uds_sa; /* security access */
}uds_service_t;




/*******************************************************************************
    Global Varaibles Extern
*******************************************************************************/


void uds_negative_rsp (uint8_t sid, uint8_t rsp_nrc);
void uds_timer_start (uint8_t num);
void uds_positive_rsp (uint8_t data[], uint16_t len);
int uds_timer_chk (uint8_t num);

/******************************************************************************
* 函数名称: void service_task(void)
* 功能说明: 应用层任务处理
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 该函数需要被 1ms 周期调用
******************************************************************************/
void service_task(void);


/******************************************************************************
* 函数名称: int service_init(void)
* 功能说明: 初始化
* 输入参数: 无
* 输出参数: 无
* 函数返回: 0: OK; -1: ERR
* 其它说明: 向 TP 层注册一些接口函数
******************************************************************************/
int service_init(void);

#endif
